home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FishMarket 1.0
/
FishMarket v1.0.iso
/
fishies
/
201-225
/
disk_203
/
examples
/
yachtc3
/
yahtzee.asm
< prev
next >
Wrap
Assembly Source File
|
1992-05-06
|
50KB
|
2,037 lines
;********************************************************************
;
; YachtC
; Copyright 1985 by Sheldon Leemon. Feel free to copy and distribute the
; program and source code, but don't try to sell, license, or otherwise
; commercially exploit it.
;
; If you have questions or comments, you may contact the author through
; Delphi (username = DRX) or Compuserve ID 72705,1355. No late-night
; phone calls, please.
;
;*********************************************************************
;
;Version 2.0 modifications by Mark Schretlen of Calgary,Alberta
; 86-03-16 ( some fixes & Steve Bennett's "scales"
; incorporated with calls to Happy, Bomb, and YahtzeeSound).
;
;Version 3.0 further modifications by M. Schretlen for
; multitasking "scales" 87-12-30.
;
;Version 4.0 Converted C to assembly code. Revamped audio portion of
; program to use dissidents' custom music library. Jeff Glatt
SECTION YachtC4Code,CODE
SMALLOBJ ;PC relative mode for CAPE assembler. If MANX, search for MANX
;comments and make appropriate changes. Also eliminate this
;PC relative directive. Please read "ManxPCBug" on this disc
;because I've used a switch which Manx will probably assemble
;incorrectly. Why not buy a real assembler instead of Manx Asm?
;MANX - uncomment these two lines
;far code ;Everyone else says "Small Data" if desired. Just like Manx to
;far data ;do it completely backwards.
;from amiga.lib or small.lib
XREF _LVOOpenFont,_LVOCloseFont,_LVOSetFont
XREF _LVOSetAPen,_LVOSetDrMd,_LVOPolyDraw,_LVOLoadRGB4
XREF _LVOWait,_LVOGetMsg,_LVOReplyMsg,_LVOPutMsg
XREF _LVOOpenWindow,_LVOCloseWindow,_LVOOpenScreen,_LVOCloseScreen
XREF _LVOOpenLibrary,_LVOCloseLibrary
XREF _LVORemoveGadget,_LVOAddGadget,_LVOOnGadget,_LVOOffGadget
XREF _LVOAutoRequest,_LVOSetMenuStrip,_LVOViewPortAddress
XREF _LVODraw,_LVOMove,_LVOText,_LVODrawImage
XREF _LVOAllocMem,_LVOFreeMem
XREF _LVOCurrentTime
;from SmallStart.asm
XREF _SysBase,_DOSBase,_ThisTask,_exit
;from CHIP.asm
XREF OneSpot,TwoSpot,ThreeSpot,FourSpot,FiveSpot,SixSpot
; XREF _do_sound,_init_sound
_do_sound:
_init_sound rts
XDEF _main
_main:
link a5,#-358
;---Open libs, screen, windows
bsr open_libs
beq Cleanup
;---Initialize sound
jsr _init_sound
;---do_sound(YAHSOUND,7)
pea 7
pea 1
jsr _do_sound
addq.l #8,sp
;---draw the score pad
bsr draw_scorecard
;==================get number of players================
; while return value < 64, (wait until number of players selected from menu)
.18 bsr IMsg ;returns 64,65,66,or 67 for players
moveq #63,d1
sub.w d1,d0
bls.s .18
move.w d0,d6 ;number of players (1-4)
;===============initialize the scores================
moveq #4-1,d3 ;initialize 4 score cards
;for cats = 0 to < SCORECATS scores[players][cats++] = -1)
;==========blank the scoring columns to -1 to start with==========
.22 moveq #84,d0
mulu.w d3,d0
lea -350(a5),a0
adda.l d0,a0
moveq #20-1,d2 ;20 scores in this players score structure
moveq #-1,d1
.27 move.l d1,(a0)+
Dbra d2,.27
;---Now re-initialize certain fields
;---except for the rows with graphics or totals (they = 0)
;---scores[players][6] = 0
lea -326(a5),a0
clr.l 0(a0,d0.l)
;---scores[players][7] = 0
lea -322(a5),a0
clr.l 0(a0,d0.l)
;---scores[players][8] = 0
lea -318(a5),a0
clr.l 0(a0,d0.l)
;---scores[players][9] = 0
lea -314(a5),a0
clr.l 0(a0,d0.l)
;---scores[players][17] = 0
lea -282(a5),a0
clr.l 0(a0,d0.l)
;---scores[players][18] = 0
lea -278(a5),a0
clr.l 0(a0,d0.l)
;---scores[players][19] = 0
lea -274(a5),a0
clr.l 0(a0,d0.l)
;---scores[players][20] = 0
lea -270(a5),a0
clr.l 0(a0,d0.l)
Dbra d3,.22
;=================draw the score pad================
bsr draw_scorecard
;================Draw the 4 player Names=============
;---Set DrawMode to JAM1
moveq #0,d0
movea.l RastPort,a1
movea.l _GfxBase,a6
jsr _LVOSetDrMd(a6)
moveq #0,d2
.30 bsr Name
addq.b #1,d2
cmp.w d6,d2
bcs.s .30
;========================play a whole game==============
;======for turns = 1 to 13 (score slots on a Yachtze Card)
moveq #13-1,d7
;=======for cur_player = 1 to #ofplayers
.34 moveq #0,d2
lea -350(a5),a3 ;scores[player0]
;---highlight the player's name
.38 moveq #5,d0 ;JAM2+INVERSVID
movea.l RastPort,a1
jsr _LVOSetDrMd(a6)
bsr Name
;---get dice values
lea -2(a5),a4 ;bones structure + 10 [start is -12(a5)]
bsr roll_dice
;---do_sound(DICEROLL,4)
pea 4
pea 4
jsr _do_sound
addq.w #8,sp
;---score_turn(scores[cur_player],bones,cur_player)
lea -12(a5),a0
bsr score_turn
;---unhighlight the player's name
moveq #1,d0 ;JAM2
movea.l RastPort,a1
movea.l _GfxBase,a6
jsr _LVOSetDrMd(a6)
bsr Name
;---next player
moveq #84,d0
adda.l d0,a3 ;next player's scores structure
addq.b #1,d2
cmp.w d6,d2
bcs.s .38
;---one score slot complete
Dbra d7,.34
bra .18 ;go back for next game, or quit
;================== "BONES" STRUCTURE ========================
; 12 byte structure holding current dice values and # of rolls
;bones dc.w die1value ;0(BASE) value of die #1
; dc.w die2value ;2
; dc.w die3value ;4
; dc.w die4value ;6
; dc.w die5value ;8
; dc.w #ofRolls ;10 total rolls/turns (3 max)
;
; This routine rolls all 5 dice (via Rollrep), waits for user to select and
; change dice for 3 turns/rolls (via IMsg and Shake), and returns the bones
; structure with final, filled-in values.
;
; roll_dice(bones+10)
; a4
XDEF roll_dice
roll_dice:
movem.l d2/a2/a3,-(sp)
movea.l _IntuitionBase,a6
lea DieGadg5,a3 ;start with last die's gadget
moveq #5-1,d2 ;last die number
;---bones[#ofRolls] = 1
moveq #1,d0
move.w d0,(a4)
;---this die's Gadget Activation = TOGGLESELECT
.45 Bset.b #0,14(a3)
;---roll all 5 dice and store results (i.e. the 1st turn/roll)
bsr Rollrep
move.w d0,-(a4)
moveq #44,d1
suba.l d1,a3
Dbra d2,.45
;---Turn on the "ROLL" gadget
suba.l a2,a2
movea.l ScoreWindow,a1
lea RollGadget,a0
jsr _LVOOnGadget(a6)
;============while changed=1 AND bones[TURNS] < 3 ==================
;while flag < 17 OR flag > 24 (wait til "ROLL" gadget selected)
.49 bsr IMsg
cmp.w #17,d0
bcs.s .49
cmp.w #24,d0
bhi.s .49 ;branch back if not ROLL gadget
;----shake whichever die is selected
movea.l _IntuitionBase,a6
bsr Shake ;returns # of dice selected for change
move.b d0,d1
beq.s .48 ;exit if none changed
moveq #3,d0
sub.w 10(a4),d0
bhi.s .49 ;branch if not 3 rolls yet (turn = 0,1,or 2)
;----Turn "ROLL" Gadget off
.48 movea.l ScoreWindow,a1
lea RollGadget,a0
jsr _LVOOffGadget(a6)
;---Disable all 5 dice gadgets
moveq #5-1,d1
lea DieGadg1+14,a0
moveq #44,d0
.54 clr.w (a0) ;this die's Gadget Activation = NULL
adda.l d0,a0
Dbra d1,.54
;=============CHECK FOR YAHTZEE (all 5 die equal)==============
;if all 5 bones values are equal, then do_sound(YAHSOUND,5)
move.w (a4)+,d0
cmp.w (a4)+,d0
bne.s .56
cmp.w (a4)+,d0
bne.s .56
cmp.w (a4)+,d0
bne.s .56
sub.w (a4)+,d0
bne.s .56
pea 5
pea 1
jsr _do_sound
addq.l #8,sp
.56 movem.l (sp)+,d2/a2/a3
rts
;**************************************************************
; This routine evaluates the current dice values in the bones array
; in terms of the score they produce for the scoring category (passed
; as row for the function "Evaluate" which returns the score).
;
;score_turn(scores,bones,cur_player)
; a3 a0 d2
XDEF score_turn
score_turn:
link a5,#-22
movem.l d3/a2,-(sp)
;-----Zero out temporary sort array
moveq #7-1,d0
lea -20(a5),a2 ;values[0]
movea.l a2,a1
.62 clr.w (a2)+
Dbra d0,.62
;============for 5 die (sort dice by number of spots)===========
moveq #5-1,d0
lea 12(a1),a2 ;values[6]
.66 move.w (a0)+,d1 ;bones[die#]
;---add (1+bones[die#]) to value[6] /* add die to total */
add.w d1,(a2) ;total of all 5 die
addq.w #1,(a2)
;---add 1 to values[bones[die#]]
add.w d1,d1
addq.w #1,0(a1,d1.w)
Dbra d0,.66
;===============position score gadget==================
;ScoreGadget.LeftEdge = VLINL + (VLINS*cur_player) + 4
moveq #90,d0
mulu.w d2,d0
addi.w #132,d0
move.w d0,_ScoreGadget+4
;==============show possible scores to let player select===============
moveq #17-1,d3 ;do 17 rows
lea 68(a3),a2 ;past row #16
;----if scores[row] = -1, then no score there yet
.70 move.l -(a2),d0
bpl.s .72
;----erase dots with bg pen
moveq #0,d0
movea.l RastPort,a1
movea.l _GfxBase,a6
jsr _LVOSetAPen(a6)
;---ShowDots (row,cur_player)
move.w d2,d0
move.w d3,d1
bsr ShowDots
;---show possible scores in purple
moveq #PURP,d0
movea.l RastPort,a1
jsr _LVOSetAPen(a6)
;---score = Evaluate(values,row)
lea -20(a5),a0
bsr Evaluate
;---ShowScore (score,row,cur_player)
move.l d2,-(sp)
move.l d3,-(sp)
move.l d0,-(sp)
bsr _ShowScore
lea 12(sp),sp
.72 Dbra d3,.70
;====wait until user clicks on a score of an unused category=======
; while row > 17 OR scores[row] is not = -1 (already scored slot)
.73 bsr IMsg
moveq #17,d1
sub.w d0,d1
bcs.s .73
move.w d0,d3 ;row # (0 to 17)
add.b d0,d0
add.w d0,d0
move.l 0(a2,d0.w),d1
bpl.s .73 ;branch back if already scored
;----selected score in forest green
moveq #FGRP,d0
movea.l RastPort,a1
movea.l _GfxBase,a6
jsr _LVOSetAPen(a6)
;---score = Evaluate(values,row) /* evaluate row selected */
lea -20(a5),a0
bsr Evaluate
move.w d0,-2(a5)
;---ShowScore (score,row,cur_player), and save score in score structure
move.l d2,-(sp)
move.w d3,d1
move.l d3,-(sp)
add.b d1,d1
add.w d1,d1
move.l d0,0(a2,d1.w) ;store score in the this row's field
move.l d0,-(sp)
bsr _ShowScore
lea 12(sp),sp
;**************Steve Bennett's "scales" sounds.**************
;if score < 3 OR (score < 6 AND row > 2) do_sound(BOMBSOUND,5)
move.w -2(a5),d0
cmp.b #3,d0
bcs.s .77
cmp.b #6,d0
bcc.s .76
cmp.w #2,d3
bls.s .76
.77 pea 5
pea 3
jsr _do_sound
addq.w #8,sp
bra .78
;else if (score > 18 AND row < 6) OR (score > 25 AND row > 8)
;do_sound(HAPPYSOUND,5)
.76 cmpi.b #18,d0
bls.s .81
cmp.w #6,d3
bcs.s .80
.81 cmpi.b #25,d0
bls.s .79
cmp.w #8,d3
bls.s .79
.80 pea 5
pea 2
jsr _do_sound
addq.w #8,sp
bra.s .78
;else if (score < 20 AND row > 8) do_sound(HAPPYSOUND,1)
.79 cmpi.b #20,d0
bcc.s .78
cmp.w #8,d3
bhi.s .80
;=================if row < 7====================
.78 moveq #7,d1
sub.w d1,d3
bcc.s .84
;---ClearRow(7,cur_player)
move.w d2,d0
; #7,d1
bsr ClearRow
;ShowScore (scores[7],7,cur_player) /* do upper sub-total
move.l d2,-(sp)
pea 7
move.w -2(a5),d0
add.w d0,30(a3) ;add score to scores[7]
move.l 28(a3),-(sp)
bsr _ShowScore
lea 12(sp),sp
bra.s .85
;----ClearRow(18,cur_player)
.84 move.w d2,d0
moveq #18,d1
bsr ClearRow
;ShowScore (scores[18],18,cur_player) /* or else lower total
move.l d2,-(sp)
pea 18
move.w -2(a5),d0
add.w d0,74(a3) ;add score to scores[18]
move.l 72(a3),-(sp)
bsr _ShowScore
lea 12(sp),sp
;if scores[7] > BONUS
.85 moveq #63,d0
sub.l 28(a3),d0
bhi.s .86
;---ClearRow(8,cur_player)
move.w d2,d0
moveq #8,d1
bsr ClearRow
;ShowScore (scores[8] = 35, 8, cur_player) /* check for bonus
move.l d2,-(sp)
pea 8
moveq #35,d0
move.l d0,32(a3)
move.l d0,-(sp)
bsr _ShowScore
lea 12(sp),sp
;==============add sub-totals to total and display=============
;---ClearRow(20,cur_player)
.86 move.w d2,d0
moveq #20,d1
bsr ClearRow
;ShowScore (scores[20]=scores[7]+scores[8]+scores[18],20,cur_player)
move.l d2,-(sp)
pea 20
move.l 28(a3),d0
add.l 32(a3),d0
add.l 72(a3),d0
move.l d0,80(a3)
move.l d0,-(sp)
bsr _ShowScore
lea 12(sp),sp
;============================= Do 17 Rows =============================
moveq #17-1,d3
lea 68(a3),a2 ;past row #16
;----Check if this row is unscored still
.89 move.l -(a2),d0
bpl.s .91
;------erase the score of this row with bg pen
moveq #0,d0
movea.l RastPort,a1
movea.l _GfxBase,a6
jsr _LVOSetAPen(a6)
;---score = Evaluate(values,row
lea -20(a5),a0
bsr Evaluate
;---ShowScore (score,row,cur_player)
move.l d2,-(sp)
move.l d3,-(sp)
move.l d0,-(sp)
bsr _ShowScore
lea 12(sp),sp
;==========draw dots in black pen===============
moveq #7,d0
movea.l RastPort,a1
movea.l _GfxBase,a6
jsr _LVOSetAPen(a6)
;----ShowDots (row,cur_player)
move.w d2,d0
move.w d3,d1
bsr ShowDots
;------------Next row------------
.91 Dbra d3,.89
movem.l (sp)+,d3/a2
unlk a5
rts
;********************************************************************
; Handles IntuiEvents of MENUPICK, GADGETUP, and CLOSEWINDOW. If CLOSEWINDOW,
; exits immediately. If GADGETUP, returns 0 to 17 for row in scorecard.
; Returns between 17 to 24 for ROLL gadg. Otherwise, default return = 35.
; If MENUPICK, returns 64 + # of players if MENU #0 selected, 32 if MENU #1
; selected.
XDEF IMsg
IMsg:
movem.l d2-d4/a2,-(sp)
;---Initially, flag = 35
moveq #35,d2
;----Wait for Score window message, then get it
movea.l ScoreWindow,a0
movea.l 86(a0),a2
move.b 15(a2),d1
moveq #0,d0
Bset.l d1,d0
movea.l _SysBase,a6
jsr _LVOWait(a6)
.95 movea.l a2,a0
jsr _LVOGetMsg(a6)
move.l d0,d1
bne.s .96
;---return flag
move.w d2,d0
movem.l (sp)+,d2-d4/a2
rts
.96 movea.l d0,a1
lea 20(a1),a0
move.l (a0)+,-(sp)
move.w (a0)+,d3 ;CODE
addq.l #8,a0
move.w (a0)+,d4 ;MOUSEY
jsr _LVOReplyMsg(a6)
move.l (sp)+,d0 ;CLASS
Btst.l #6,d0
bne.s .100
Btst.l #8,d0
bne.s .101
Btst.l #9,d0
beq.s .95
;===============case CLOSEWINDOW:==================
.99 movem.l (sp)+,d2-d4/a2
bra Cleanup
;===============case GADGETUP:=====================
;---flag (i.e. row #) = (MOUSEY-29)/8
.100 move.w d4,d2
moveq #29,d1
sub.w d1,d2
lsr.w #3,d2
bra.s .95
;==============case MENUPICK:====================
.101 move.w d3,d1
andi.w #$1F,d3
beq .104
subq.w #1,d3
bne.s .95
;=============MENU 1:
.105 lsr.w #5,d1
andi.w #$3F,d1
beq.s .108
;----------ITEM 1:
; Show the about requester
.109 move.w #148,d3
lea _AboutText+200,a1
.PP movem.l a2/a3/a6,-(sp)
move.w #515,d2
moveq #0,d0
moveq #0,d1
movea.l ScoreWindow,a0
lea _OKText,a3
suba.l a2,a2
movea.l _IntuitionBase,a6
jsr _LVOAutoRequest(a6)
movem.l (sp)+,a2/a3/a6
;---flag = 32
moveq #32,d2
bra .95
;--------ITEM 0:
; Show the Instructions requester
.108 move.w #180,d3
lea _InstructText+260,a1
bra.s .PP
;==============MENU 0:
;-----flag (i.e. number of players + 64) = 64 + ITEMNUM
.104 lsr.w #5,d1
andi.w #$3F,d1
moveq #64,d2
add.b d1,d2
bra .95
;==================================================================
;changed = Shake(bones, IntuitionBase)
; a4 a6
XDEF Shake
Shake:
movem.l d2/d3/a2/a3,-(sp)
moveq #0,d3 ;initially, changed = 0
moveq #5-1,d2 ;# of die
lea DieGadg5,a3 ;start with last die
suba.l a2,a2 ;for OnGadget
;---Turn on this die
.115 movea.l ScoreWindow,a1
movea.l a3,a0
jsr _LVOOnGadget(a6)
;If this die's Flags = SELECTED, then roll die and store result
Btst.b #7,13(a3)
beq.s .113
bsr.s Rollrep
move.l d2,d1
add.b d1,d1
move.w d0,0(a4,d1.l)
;=============Deselect the die Gadget==============
;Since its not nice to change the SELECTED flag while the gadget is active
;(only the user is supposed to do that by clicking on it), we'll be nice
;and first Remove the die gadget from the list, THEN change the flag
;and finally, Add it back to the list again.
;---RemoveGadget(BdWdw, &DieGadg[die#])
movea.l a3,a1
movea.l ScoreWindow,a0
jsr _LVORemoveGadget(a6)
;---toggle SELECTED flag
Bchg.b #7,13(a3)
;---AddGadget(BdWdw,&DieGadg[die#],Gadget#)
movea.l a3,a1
movea.l ScoreWindow,a0
jsr _LVOAddGadget(a6)
addq.b #1,d3
.113 moveq #44,d0
suba.l d0,a3 ;next die Gadget
Dbra d2,.115
;----increment bones[TURNS] (another roll finished)
addq.w #1,10(a4)
;---return total number of changed (selected) dice
move.w d3,d0
movem.l (sp)+,d2/d3/a2/a3
rts
;==================================================================
;throw = Rollrep(die_number, DieGadgAddr, Intuitionbase)
; d2 a3 a6
XDEF Rollrep
Rollrep:
move.l d3,-(sp)
move.l d4,-(sp)
moveq #9-1,d3 ;do 9 random throws before final value returned
;----throw = random()%6
roll bsr.s random
moveq #6,d1
divu d1,d0
swap d0
move.w d0,d4
;---Blank out the Die face
moveq #31,d1 ;BLANKS
mulu.w d2,d1
moveq #20,d0 ;BLANKT
add.w d0,d1 ;TopOffset = (BLANKS*Die#)+BLANKIT
move.w #530,d0 ;LeftOffset = BLANKL
lea BlankImage,a1
movea.l RastPort,a0
movem.l d0/d1/a0,-(sp)
jsr _LVODrawImage(a6)
;---Draw the die Image that was thrown and store address in die's Gadget-
; Render field for subsequent updates
moveq #20,d0
mulu.w d4,d0
lea Die1Image,a1
adda.l d0,a1 ;The image struct of this die
move.l a1,18(a3) ;store in die's GadgetRender field
movem.l (sp)+,d0/d1/a0
jsr _LVODrawImage(a6)
Dbra d3,roll
;---return(throw)
move.w d4,d0
move.l (sp)+,d4
move.l (sp)+,d3
rts
XDEF random,RAND
random:
;----RAND = RAND * 1103515245 + 12345
move.l #1103515245,d1
move.l RAND,d0
bsr.s multiply
addi.l #12345,d0
move.l d0,RAND
;-----return (RAND/65536) % 32768
clr.w d0
swap d0 ;divide by 65536
Bclr.l #15,d0
rts
XDEF multiply
;This routine multiplies 2 numbers passed in d0 and d1.
;d0 x d1 = d0 (unsigned)
multiply movea.l d2,a0 ;save d2 and d3
movea.l d3,a1
move.l d0,d2
move.l d1,d3
swap d2
swap d3
mulu d1,d2
mulu d0,d3
mulu d1,d0
add.w d3,d2
swap d2
clr.w d2
add.l d2,d0
move.l a1,d3 ;restore d2 and d3
move.l a0,d2
rts
RAND dc.l 1
;==================================================================
;score = Evaluate (values,row)
; a0 d3
evl dc.w .zr-evl2
dc.w .zr-evl2
dc.w .zr-evl2
dc.w .140-evl2
dc.w .148-evl2
dc.w .156-evl2
dc.w .164-evl2
dc.w .176-evl2
dc.w .199-evl2
dc.w .205-evl2
XDEF Evaluate
Evaluate:
move.l d2,-(sp)
;--------switch(row)
move.l d3,d1
subq.l #7,d1
bls.s .0to5
moveq #10,d0
cmp.l d0,d1
bcc.s .zr
add.b d1,d1
move.w evl(pc,d1.w),d1
evl2 jmp evl2(pc,d1.w)
;=================case 0: through case 5:=====================
;----return (row+1)*values[row] (return total of desired spots)
.0to5:
move.w d3,d0
move.l d3,d1
addq.b #1,d0
add.b d1,d1
adda.l d1,a0
mulu.w (a0),d0
bra.s .139
;===============case 10: 3 of a kind===============
.140 moveq #2,d1
bra.s KD
;===============case 11: 4 of a kind===============
.148 moveq #3,d1
KD moveq #0,d0
;----if values[count] > 3, return values[6] (total of dice) instead of 0
moveq #6-1,d2
lea 12(a0),a1
.151 cmp.w (a0)+,d1
bcc.s .149
move.w (a1),d0
.149 Dbra d2,.151
bra.s .139
;==============case 12: full house=============
.156 moveq #0,d1
;---if values[count] > 1, flagg = flagg + values[count]
moveq #6-1,d2
moveq #1,d0
.159 cmp.w (a0)+,d0
bcc.s .158
add.w -2(a0),d1
.158 Dbra d2,.159
;---If flagg = 5, return 25. Otherwise 0.
moveq #0,d0
subq.b #5,d1
bne.s .139
moveq #25,d0
.139 move.l (sp)+,d2
rts
;============case 13: small straight============
.164 moveq #3-1,d1 ;do 3 checks
SRT movea.l a0,a1
moveq #4-1,d2 ;check for 4 numbers in order
;---Is there 1 (or more) of this #?
AGN move.w (a1)+,d0
Dbeq d2,AGN ;fall through if no occurences of this #
bne.s strt ;must be a straight of 4 numbers
;---Try next 4 numbers
addq.l #2,a0
Dbra d1,SRT
bra.s .zr
strt moveq #30,d0
bra.s .139
;==============case 14: large straight===============
.176 moveq #2-1,d1 ;do 2 checks
SRt movea.l a0,a1
moveq #5-1,d2 ;check for 5 numbers in order
;---Is there 1 (or more) of this #?
AGn move.w (a1)+,d0
Dbeq d2,AGn ;fall through if no occurences of this #
bne.s strT ;must be a straight of 4 numbers
;---Try next 4 numbers
addq.l #2,a0
Dbra d1,SRt
.zr moveq #0,d0
bra.s .139
strT moveq #40,d0
bra.s .139
;================case 15: Yachtze==============
;---if values[count] = 5, then return 50
.199 moveq #6-1,d2 ;do 6 die
moveq #0,d0
moveq #5,d1 ;check for 5 of this die
.202 cmp.w (a0)+,d1
Dbeq d2,.202
bne .139
moveq #50,d0
bra .139
;=============case 16: Chance============
;----return values[6]
.205 moveq #0,d0
move.w 12(a0),d0
bra .139
;==================================================================
;ShowScore(score,row,player)
XDEF _ShowScore
_ShowScore:
movem.l d2/a2,-(sp)
movea.l _GfxBase,a6
;---SetDrMd to JAM1
moveq #0,d0
movea.l RastPort,a1
movea.l a1,a2
jsr _LVOSetDrMd(a6)
;---Move (BdRp,DOTL + (DOTS*player), (row*TEXTS)+DOTT )
move.w 18(sp),d1
lsl.w #3,d1
moveq #36,d2
add.w d2,d1
move.w 22(sp),d0
mulu.w #90,d0
move.b #155,d2
add.w d2,d0
movea.l a2,a1
jsr _LVOMove(a6)
;---Text (BdRp, " ",4)
moveq #4,d0
lea Spaces,a0
movea.l a2,a1
jsr _LVOText(a6)
;---format_4(score_str,score)
move.l 12(sp),d0
lea Zeros,a0
bsr.s format_4
;Move (BdRp,DOTL + (DOTS*player + ((4-length)*SPACEW) ), (row*TEXTS)+DOTT )
move.w 22(sp),d0
mulu.w #90,d0
add.w #155,d0 ;x
;---
move.w 18(sp),d1
lsl.w #3,d1
moveq #36,d2
add.w d2,d1 ;y
movea.l a2,a1
jsr _LVOMove(a6)
;---Text (BdRp, score_str, length)
moveq #4,d0
lea Zeros,a0
movea.l a2,a1
movem.l (sp)+,d2/a2
jmp _LVOText(a6)
;===================================================================
; An sprintf for positive hex to decimal ascii string, 4 digit field. Blanks
; are filled for leading zeros, and buffer padded out to 4 chars.
;
; format_4(value, Buffer)
; d0 a0
Conversion dc.w 1000,100,10,1
XDEF format_4
format_4:
movem.l d2-d4,-(sp)
moveq #0,d4 ;leading zero flag
;---Convert the value to Decimal
moveq #4-1,d2 ;do 4 digits
lea Conversion,a1
g07 moveq #0,d1 ;where to store the converted digit
move.w (a1)+,d3 ;the next conversion factor
;---Convert a digit field (for example, the 10s digit)
Rep1 cmp.w d3,d0
bcs.s g011
addq.b #1,d1
sub.l d3,d0
bra.s Rep1
;---Check whether we have a leading digit of zero. If so, move
;---on to the next field unless this IS the last field in
;---which case we have to store a 0. If this digit is
;---not a zero, then print it.
g011 move.b d1,d3 ;test for 0 digit
beq.s g012
moveq #1,d4 ;indicate non-zero digit (only set once)
g012 move.b d4,d3
bne.s g013
move.w d2,d3
beq.s g013 ;branch if the 1's digit AND value is zero
moveq #' ',d1
bra.s SF
;---Convert to Ascii and store this digit
g013 addi.b #'0',d1
SF move.b d1,(a0)+
g014 Dbra d2,g07 ;next digit calculation
clr.b (a0)
movem.l (sp)+,d2-d4
rts
;=================================================================
;ShowDots (row,player)
; d1 d0
XDEF ShowDots
ShowDots:
;----Move (BdRp,DOTL + (DOTS*player), (row*TEXTS)+DOTT )
move.l d2,-(sp)
lsl.w #3,d1
moveq #36,d2
add.w d2,d1
moveq #90,d2
mulu.w d2,d0
move.b #155,d2
add.w d2,d0
movea.l RastPort,a1
move.l (sp),d2
move.l a1,(sp)
movea.l _GfxBase,a6
jsr _LVOMove(a6)
;---SetDrMd to JAM1
moveq #0,d0
movea.l (sp),a1
jsr _LVOSetDrMd(a6)
;---Print out '....'
moveq #4,d0
lea Dots,a0
movea.l (sp)+,a1
jmp _LVOText(a6)
Dots dc.b '....',0
Zeros dc.b '0000',0
;======================================================================
;ClearRow (row,player)
; d1 d0
XDEF ClearRow
ClearRow:
;----Move (BdRp,DOTL + (DOTS*player), (row*TEXTS)+DOTT )
move.l d2,-(sp)
lsl.w #3,d1
moveq #36,d2
add.w d2,d1
moveq #90,d2
mulu.w d2,d0
move.b #155,d2
add.w d2,d0
movea.l RastPort,a1
move.l (sp),d2
move.l a1,(sp)
movea.l _GfxBase,a6
jsr _LVOMove(a6)
;---SetDrMd to JAM2
moveq #1,d0
movea.l (sp),a1
jsr _LVOSetDrMd(a6)
;---Output " "
moveq #4,d0
lea Spaces,a0
movea.l (sp)+,a1
jmp _LVOText(a6)
;====================================================================
;Name (player, _GfxBase)
; d2 a6
XDEF Name
Name:
;---Move(BdRp, DOTL -(2*SPACEW) + (DOTS*player), TEXTT+2)
moveq #90,d0
mulu.w d2,d0
moveq #0,d1
move.b #135,d1
add.w d1,d0
moveq #22,d1
movea.l RastPort,a1
move.l a1,-(sp)
jsr _LVOMove(a6)
;---Text(BdRp, textline[MAXLINES+player], 8)
movea.l (sp)+,a1
moveq #8,d0
moveq #23,d1 ;MAXLINES
add.w d2,d1
add.w d1,d1
add.w d1,d1
lea _textline,a0
adda.w d1,a0
movea.l (a0),a0
jmp _LVOText(a6)
;===================================================================
; Open intuition, graphics libs, font, windows, screen, set menu
; returns d0 = 1 if successful, 0 if something failed.
LIB_VERSION equ 33
XDEF open_libs
open_libs:
;======Open The Intuition Library=======
B0 moveq #LIB_VERSION,d0
lea IntuitionName,a1
movea.l _SysBase,a6
jsr _LVOOpenLibrary(a6)
move.l d0,_IntuitionBase
beq B10
;======Open The Graphics Library========
B1 moveq #LIB_VERSION,d0
lea GfxName,a1
jsr _LVOOpenLibrary(a6)
move.l d0,_GfxBase
beq B10
;========Open the Topaz 8 Font==========
B4 lea TextAttr,a0
movea.l _GfxBase,a6
jsr _LVOOpenFont(a6)
move.l d0,FontPtr
beq B10
;==========Open Custom Screen===========
B5 lea NewScreen,a0
movea.l _IntuitionBase,a6
jsr _LVOOpenScreen(a6)
move.l d0,Screen
beq B10
lea NewWindow,a0
move.l d0,30(a0)
;=========Open the main window==========
jsr _LVOOpenWindow(a6)
move.l d0,ScoreWindow
beq B10
;====Get Pointer to Window's RastPort=====
B6 movea.l d0,a0
movea.l 50(a0),a1
move.l a1,RastPort ;the address our this window's rastport.
;====Set the Font for this window to Topaz 8====
B7 movea.l FontPtr,a0
movea.l _GfxBase,a6
jsr _LVOSetFont(a6)
;====Attach our menus to the window======
B8 lea _BdMenu,a1
movea.l ScoreWindow,a0
movea.l _IntuitionBase,a6
jsr _LVOSetMenuStrip(a6)
;====Get the Front Window's ViewPort==========
movea.l ScoreWindow,a0
jsr _LVOViewPortAddress(a6)
move.l d0,_WVPort
;=======load our new set of (8) colors======
movea.l d0,a0
moveq #8,d0
lea _colormap,a1
movea.l _GfxBase,a6
jsr _LVOLoadRGB4(a6)
;====Indicate that everything worked=====
moveq #1,d0 ;If we got here, indicate success by d0 = 1.
B10 rts
XDEF draw_scorecard
draw_scorecard:
link a5,#-8
movem.l d2/d3/a2/a3/a4,-(sp)
;====================Set up the board outline===========================
;--SetAPen to BLKP
moveq #7,d0
movea.l RastPort,a1
movea.l a1,a2
movea.l _GfxBase,a6
jsr _LVOSetAPen(a6)
;--Move to (0,VLINT)
moveq #13,d1 ;VLINT
moveq #0,d0
movea.l a2,a1
jsr _LVOMove(a6)
;---SetDrMd = JAM2
moveq #1,d0
movea.l a2,a1
jsr _LVOSetDrMd(a6)
;---PolyDraw 8 boardlines points
lea _boardlines,a0
moveq #8,d0
movea.l a2,a1
jsr _LVOPolyDraw(a6)
;==============Put in text and horizontal lines for board===========
;---Move to (TEXTL,TEXTT+2)
moveq #22,d1
moveq #5,d0
movea.l a2,a1
jsr _LVOMove(a6)
;---Print out "players"
lea _textline,a3
movea.l (a3)+,a0
movea.l a0,a1
len move.b (a1)+,d0
bne.s len
subq.l #1,a1
move.l a1,d0
sub.l a0,d0
movea.l a2,a1
jsr _LVOText(a6)
;===========for count = 1 to < MAXLINES==================
moveq #1,d0
move.w d0,-8(a5)
moveq #28,d2 ;Y position = (line# * TEXTS) + TEXTT
;---if the textline string = ' ' then draw a line
.238 movea.l (a3)+,a4
move.b (a4),d0
bne.s .239
;----Move to (1,[count*HLINS+HLINT])
move.w d2,d1
subq.w #2,d1
moveq #1,d0
movea.l a2,a1
jsr _LVOMove(a6)
;-----Draw to (HLINR,[count*HLINS+HLINT])
move.w d2,d1
subq.w #2,d1
move.w #489,d0
movea.l a2,a1
jsr _LVODraw(a6)
bra.s .236
;=======else, print the text and do columns=============
;---Move(BdRp,TEXTL,(count*TEXTS)+TEXTT)
.239 move.w d2,d1
moveq #5,d0
movea.l a2,a1
jsr _LVOMove(a6)
;---Text(BdRp,textline[count],strlen(textline[count]))
movea.l a4,a0
leN move.b (a4)+,d0
bne.s leN
subq.l #1,a4
move.l a4,d0
sub.l a0,d0
movea.l a2,a1
jsr _LVOText(a6)
;=========for column = 0 to < MAXPLAYERS
moveq #4-1,d3
;----ClearRow(count-2,column)
.243 move.w d3,d0
move.w -8(a5),d1
subq.w #2,d1
bsr ClearRow
;---ShowDots(count-2,column)
move.w d3,d0
move.w -8(a5),d1
subq.w #2,d1
bsr ShowDots
Dbra d3,.243
.236 addq.w #8,d2
addq.w #1,-8(a5)
cmp.w #23,-8(a5)
bcs.s .238
;==================Draw vertical lines for board==================
; for count = 0 to < MAXPLAYERS should replace this with DrawBorder
moveq #4-1,d3
moveq #127,d2
addq.b #2,d2 ;VLINL+1
;----Move(BdRp,(count*VLINS)+VLINL+1,VLINT)
.246 move.w d2,d0
moveq #13,d1 ;VLINT
movea.l a2,a1
jsr _LVOMove(a6)
;---Draw(BdRp,(count*VLINS)+VLINL+1,VLINB)
moveq #0,d1
move.b #199,d1
move.w d2,d0
movea.l a2,a1
jsr _LVODraw(a6)
;---Move(BdRp,(count*VLINS)+VLINL,VLINT)
moveq #13,d1
subq.w #1,d2
move.w d2,d0
movea.l a2,a1
jsr _LVOMove(a6)
;---Draw(BdRp,(count*VLINS)+VLINL,VLINB)
move.w d2,d0
moveq #0,d1
move.b #199,d1
movea.l a2,a1
jsr _LVODraw(a6)
moveq #91,d1 ;VLINS+1
add.w d1,d2 ;next line y position
Dbra d3,.246
;=======================Blank players names======================
;---SetDrMd = JAM2
moveq #1,d0
movea.l a2,a1
jsr _LVOSetDrMd(a6)
moveq #4-1,d3
move.w #135,d2
;---Move(BdRp, DOTL - (2*SPACEW) + (DOTS*count), TEXTT+2)
.249 moveq #22,d1
move.w d2,d0
movea.l a2,a1
jsr _LVOMove(a6)
;---Output 8 spaces
moveq #8,d0
lea Spaces,a0
movea.l a2,a1
jsr _LVOText(a6)
moveq #90,d1
add.w d1,d2
Dbra d3,.249
;================Set initial 5 die images to Sixes=======================
moveq #5-1,d3
moveq #20,d2 ;BLANKT
movea.l _IntuitionBase,a6
;DrawImage (BdRp, &Blank, BLANKL, (BLANKS*count) + BLANKT)
.252 move.w d2,d1
move.w #530,d0
lea BlankImage,a1
movea.l a2,a0
movem.l d0/d1/a0,-(sp)
jsr _LVODrawImage(a6)
;DrawImage (BdRp, &DieImage[5], BLANKL, (BLANKS*count) + BLANKT)
movem.l (sp)+,d0/d1/a0
lea Die6Image,a1
jsr _LVODrawImage(a6)
moveq #31,d1 ;BLANKS
add.w d1,d2
Dbra d3,.252
;================use time to seed random number generator============
;---CurrentTime(&Seconds,&Micros)
lea -8(a5),a1
lea -4(a5),a0
jsr _LVOCurrentTime(a6)
;---seed random generator with Micros
move.l -8(a5),RAND
movem.l (sp)+,d2/d3/a2/a3/a4
unlk a5
rts
XDEF Cleanup
Cleanup:
;----do_sound(NULL,0)
clr.l -(sp)
clr.l -(sp)
jsr _do_sound
addq.l #8,sp
;---Close BdWdw window
noM movea.l _IntuitionBase,a6
move.l ScoreWindow,d0
beq.s noW
movea.l d0,a0
jsr _LVOCloseWindow(a6)
;---Close BdScr screen
noW move.l Screen,d0
beq.s NoS
movea.l d0,a0
jsr _LVOCloseScreen(a6)
;---Close Graphics and Intuition Libraries
NoS movea.l _SysBase,a6
move.l _GfxBase,d0
beq.s noG
movea.l d0,a1
jsr _LVOCloseLibrary(a6)
noG move.l _IntuitionBase,d0
beq.s noI
movea.l d0,a1
jsr _LVOCloseLibrary(a6)
noI clr.l -(sp)
jsr _exit
;MANX need this section directive
; SECTION YahtzeeData,DATA
XDEF _GfxBase,_IntuitionBase,Screen,ScoreWindow,_BackWdw,_WVPort
_IntuitionBase dc.l 0
_GfxBase dc.l 0
Screen dc.l 0
FontPtr dc.l 0
ScoreWindow dc.l 0
RastPort dc.l 0
_BackWdw dc.l 0
_WVPort dc.l 0
;=========================== NEWSCREEN STRUCTURE =========================
XDEF NewScreen
NewScreen:
dc.w 0,0,640,200 ;LEFTEDGE,TOPEDGE,WIDTH,HEIGHT
dc.w 3
dc.b 5,2
dc.w $8000
dc.w 15
dc.l TextAttr
dc.l $0000
dc.l $0000
dc.l $0000
;============================ NEWWINDOW STRUCTURES =======================
XDEF NewWindow
NewWindow:
dc.w 0,0,640,200
dc.b 6,3
;---IDCMPFlags = CLOSEWINDOW | GADGETUP | MENUPICK
dc.l $0340
dc.l $180c
dc.l _ScoreGadget
dc.l $0000
dc.l NBTitle
dc.l $0000
dc.l $0000
dc.w 0,0,0,0
dc.w 15
;=========================== BORDER FOR SCORECARD =========================
HLINR equ 489
VLINT equ 13
VLINB equ 199
HLINL equ 1
XDEF _boardlines
_boardlines: dc.w HLINR,VLINT,HLINR,VLINB,HLINL-1,VLINB,HLINL-1,VLINT
dc.w HLINL,VLINT,HLINL,VLINB,HLINR-1,VLINB,HLINR-1,VLINT
;======================== PEN COLORS (COLORMAP) =====================
BGRP equ 0
REDP equ 1
GRNP equ 2
YELP equ 3
FGRP equ 4
PURP equ 5
BLUP equ 6
BLKP equ 7
XDEF _colormap
_colormap:
dc.w $FFF ;WHITE (background color)
dc.w $F00 ;RED (color of window-close box)
dc.w $0F0 ;GREEN (color of menu title)
dc.w $FF0 ;YELLOW (color of window-close dot)
dc.w $0B1 ;FOREST GREEN (scores)
dc.w $91F ;PURPLE (color of possible scores)
dc.w $00F ;BLUE
dc.w $000 ;BLACK
;==================== TEXT ATTRIBUTE STRUCTURE (Topaz 9) =================
XDEF TextAttr
TextAttr:
dc.l FontName
dc.w 9
dc.b 0
dc.b 1
;================== IMAGE STRUCTURE FOR BLANKING DIE ================
XDEF BlankImage
BlankImage:
dc.w 0,0,56,23
dc.w 1
dc.l $0000
dc.b 0,1
dc.l $0000
;================= IMAGE STRUCTURES FOR 6 FACES OF A DIE ==================
XDEF Die1Image,Die2Image,Die3Image,Die4Image,Die5Image,Die6Image
Die1Image:
dc.w 4,2,48,19
dc.w 1
dc.l OneSpot
dc.b 2,1
dc.l $0000
Die2Image:
dc.w 4,2,48,19
dc.w 1
dc.l TwoSpot
dc.b 2,1
dc.l $0000
Die3Image:
dc.w 4,2,48,19
dc.w 1
dc.l ThreeSpot
dc.b 2,1
dc.l $0000
Die4Image:
dc.w 4,2,48,19
dc.w 1
dc.l FourSpot
dc.b 2,1
dc.l $0000
Die5Image:
dc.w 4,2,48,19
dc.w 1
dc.l FiveSpot
dc.b 2,1
dc.l $0000
Die6Image:
dc.w 4,2,48,19
dc.w 1
dc.l SixSpot
dc.b 2,1
dc.l $0000
;================== GADGET STRUCTURES FOR 5 DICE ==================
XDEF DieGadg1
DieGadg1:
dc.l DieGadg2
dc.w 530,20,56,23
dc.w 6 ;Flags = GADGIMAGE | GADGHIMAGE
dc.w 0 ;Activation is initially none. Only enabled when rolled
dc.w 1 ;BOOLGADGET type
dc.l Die6Image ;Selected Image is changed depending on die roll
dc.l BlankImage ;DeSelected Image is always Blank
dc.l $0000
dc.l $0000
dc.l $0000
dc.w 1
dc.l 0
DieGadg2:
dc.l DieGadg3
dc.w 530,51,56,23
dc.w 6
dc.w 0
dc.w 1
dc.l Die6Image
dc.l BlankImage
dc.l $0000
dc.l $0000
dc.l $0000
dc.w 2
dc.l $0000
DieGadg3:
dc.l DieGadg4
dc.w 530,82,56,23
dc.w 6
dc.w 0
dc.w 1
dc.l Die6Image
dc.l BlankImage
dc.l $0000
dc.l $0000
dc.l $0000
dc.w 3
dc.l $0000
DieGadg4:
dc.l DieGadg5
dc.w 530,113,56,23
dc.w 6
dc.w 0
dc.w 1
dc.l Die6Image
dc.l BlankImage
dc.l $0000
dc.l $0000
dc.l $0000
dc.w 4
dc.l $0000
DieGadg5:
dc.l 0
dc.w 530,144,56,23
dc.w 6
dc.w 0
dc.w 1
dc.l Die6Image
dc.l BlankImage
dc.l $0000
dc.l $0000
dc.l $0000
dc.w 5
dc.l $0000
XDEF _RollText
_RollText:
dc.b 2
dc.b 1
dc.b 1
dc.b 0
dc.w 0
dc.w 7
dc.l TextAttr
dc.l ROLL
dc.l $0000
ROLL dc.b ' ROLL',0
XDEF RollGadget
RollGadget:
dc.l DieGadg1
dc.w 530,175,56,23
dc.w 260
dc.w 1
dc.w 1
dc.l BlankImage
dc.l $0000
dc.l _RollText
dc.l $0000
dc.l $0000
dc.w 6
dc.l 0
XDEF _ScoreGadget
_ScoreGadget:
dc.l RollGadget
dc.w 132,29,84,136
dc.w 3
dc.w 1
dc.w 1
dc.l $0000
dc.l $0000
dc.l $0000
dc.l $0000
dc.l $0000
dc.w 7
dc.l 0
XDEF _AboutText
_AboutText:
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 9
dc.l TextAttr
dc.l .4+0
dc.l $0000
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 18
dc.l TextAttr
dc.l .4+46
dc.l _AboutText
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 27
dc.l TextAttr
dc.l .4+92
dc.l _AboutText+20
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 36
dc.l TextAttr
dc.l .4+138
dc.l _AboutText+40
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 45
dc.l TextAttr
dc.l .4+184
dc.l _AboutText+60
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 54
dc.l TextAttr
dc.l .4+230
dc.l _AboutText+80
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 63
dc.l TextAttr
dc.l .4+276
dc.l _AboutText+100
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 72
dc.l TextAttr
dc.l .4+322
dc.l _AboutText+120
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 81
dc.l TextAttr
dc.l .4+368
dc.l _AboutText+140
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 90
dc.l TextAttr
dc.l .4+414
dc.l _AboutText+160
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 20
dc.w 98
dc.l TextAttr
dc.l .4+460
dc.l _AboutText+180
;=========================== TEXT ============================
XDEF _textline
_textline:
dc.l SC1
dc.l SC2
dc.l SC3
dc.l SC4
dc.l SC5
dc.l SC6
dc.l SC7
dc.l SC8
dc.l SC9
dc.l SC10
dc.l SC11
dc.l SC12
dc.l SC13
dc.l SC14
dc.l SC15
dc.l SC16
dc.l SC17
dc.l SC18
dc.l SC19
dc.l SC20
dc.l SC21
dc.l SC22
dc.l SC23
dc.l SC24
dc.l SC25
dc.l SC26
dc.l SC27
XDEF _InstructText
_InstructText:
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 9
dc.l TextAttr
dc.l .5+0
dc.l $0000
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 18
dc.l TextAttr
dc.l .5+47
dc.l _InstructText
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 27
dc.l TextAttr
dc.l .5+94
dc.l _InstructText+20
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 36
dc.l TextAttr
dc.l .5+141
dc.l _InstructText+40
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 45
dc.l TextAttr
dc.l .5+188
dc.l _InstructText+60
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 54
dc.l TextAttr
dc.l .5+235
dc.l _InstructText+80
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 63
dc.l TextAttr
dc.l .5+282
dc.l _InstructText+100
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 72
dc.l TextAttr
dc.l .5+329
dc.l _InstructText+120
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 81
dc.l TextAttr
dc.l .5+376
dc.l _InstructText+140
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 90
dc.l TextAttr
dc.l .5+423
dc.l _InstructText+160
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 99
dc.l TextAttr
dc.l .5+470
dc.l _InstructText+180
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 108
dc.l TextAttr
dc.l .5+517
dc.l _InstructText+200
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 117
dc.l TextAttr
dc.l .5+564
dc.l _InstructText+220
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 16
dc.w 126
dc.l TextAttr
dc.l .5+611
dc.l _InstructText+240
XDEF _OKText
_OKText:
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 6
dc.w 3
dc.l TextAttr
dc.l .6
dc.l $0000
.6 dc.b 32,80,114,111,99,101,101,100,32,0
XDEF _Menu0IText
_Menu0IText:
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 0
dc.w 0
dc.l TextAttr
dc.l .7+0
dc.l $0000
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 0
dc.w 0
dc.l TextAttr
dc.l .7+22
dc.l $0000
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 0
dc.w 0
dc.l TextAttr
dc.l .7+44
dc.l $0000
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 0
dc.w 0
dc.l TextAttr
dc.l .7+66
dc.l $0000
XDEF _Menu1IText
_Menu1IText:
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 0
dc.w 0
dc.l TextAttr
dc.l INSTR
dc.l $0000
dc.b 6
dc.b 0
dc.b 1
dc.b 0
dc.w 0
dc.w 0
dc.l TextAttr
dc.l ABOUT
dc.l $0000
XDEF _Menu0Item
_Menu0Item:
dc.l _Menu0Item+34
dc.w 0,0,210,9
dc.w 82
dc.l $0000
dc.l _Menu0IText
dc.l $0000
dc.b 0,0
dc.l $0000
dc.w -1
dc.l _Menu0Item+68
dc.w 0,9,210,9
dc.w 82
dc.l $0000
dc.l _Menu0IText+20
dc.l $0000
dc.b 0,0
dc.l $0000
dc.w -1
dc.l _Menu0Item+102
dc.w 0,18,210,9
dc.w 82
dc.l $0000
dc.l _Menu0IText+40
dc.l $0000
dc.b 0,0
dc.l $0000
dc.w -1
dc.l $0000
dc.w 0,27,210,9
dc.w 82
dc.l $0000
dc.l _Menu0IText+60
dc.l $0000
dc.b 0,0
dc.l $0000
dc.w -1
XDEF _Menu1Item
_Menu1Item:
dc.l _Menu1Item+34
dc.w 0,0,140,9
dc.w 82
dc.l $0000
dc.l _Menu1IText
dc.l $0000
dc.b 0,0
dc.l $0000
dc.w -1
dc.l $0000
dc.w 0,9,140,9
dc.w 82
dc.l $0000
dc.l _Menu1IText+20
dc.l $0000
dc.b 0,0
dc.l $0000
dc.w -1
XDEF _BdMenu
_BdMenu:
dc.l _BdMenu+30
dc.w 40
dc.w 0
dc.w 90
dc.w 0
dc.w 1
dc.l START
dc.l _Menu0Item
ds.b 8
dc.l $0000
dc.w 160
dc.w 0
dc.w 130
dc.w 0
dc.w 1
dc.l INFO
dc.l _Menu1Item
ds.b 8
SC1 dc.b 'Players'
SC2:
SC9:
SC12:
SC20:
SC22:
dc.b 0
SC3 dc.b 'Aces ',0
SC4 dc.b 'Twos ',0
SC5 dc.b 'Threes ',0
SC6 dc.b 'Fours ',0
SC7 dc.b 'Fives ',0
SC8 dc.b 'Sixes ',0
SC10 dc.b 'Upper Total',0
SC11 dc.b 'Bonus ',0
SC13 dc.b '3 of a Kind',0
SC14 dc.b '4 of a Kind',0
SC15 dc.b 'Full House ',0
SC16 dc.b 'Sm Straight',0
SC17 dc.b 'Lg Straight',0
SC18 dc.b 'Yacht ',0
SC19 dc.b 'Yarboro ',0
SC21 dc.b 'Lower Total',0
SC23 dc.b 'Grand Total',0
SC24 dc.b ' One ',0
SC25 dc.b ' Two ',0
SC26 dc.b ' Three ',0
SC27 dc.b ' Four ',0
.4 dc.b ' ',0
dc.b ' YachtC ',0
dc.b ' Copyright 1985 by Sheldon Leemon ',0
dc.b ' ',0
dc.b ' You may copy and distribute this program ',0
dc.b ' freely (i.e. for no money), but any kind ',0
dc.b ' of commercial exploitation is a no-no. ',0
dc.b ' **** Version 4.0 by Jeff Glatt **** ',0
dc.b ' Based on a version by Mark Schretlen with ',0
dc.b ' "scales" sound sources by Steve Bennett. ',0
dc.b ' ',0
.5 dc.b ' ',0
dc.b ' Instructions ',0
dc.b ' ',0
dc.b ' To start game, select 1-4 Player game from ',0
dc.b ' the Project menu. Each player gets up to ',0
dc.b ' 3 rolls of the dice to make the best hand ',0
dc.b ' possible. Click on the dice you wish to ',0
dc.b ' change, then click on the button below the ',0
dc.b ' dice to roll. If you are satisfied with ',0
dc.b ' your hand, and wish to score, click on the ',0
dc.b ' button without blanking any dice. All ',0
dc.b ' possible scores will appear in purple on ',0
dc.b ' the scorepad. Click on the one you want. ',0
dc.b ' ',0
.7 dc.b ' Start 1-Player Game ',0
dc.b ' Start 2-Player Game ',0
dc.b ' Start 3-Player Game ',0
dc.b ' Start 4-Player Game ',0
INSTR dc.b ' Instructions ',0
ABOUT dc.b ' About YachtC ',0
START dc.b ' Start ',0
INFO dc.b ' Information ',0
FontName dc.b 'topaz.font',0
IntuitionName dc.b 'intuition.library',0
GfxName dc.b 'graphics.library',0
NBTitle dc.b ' YachtC (V4.0) ',0
Spaces dc.b ' ',0
END